home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Aminet 5
/
Aminet 5 - March 1995.iso
/
Aminet
/
mus
/
edit
/
AlgoRhythms.lha
/
AlgoRhythms
/
Source
/
musicrexx.c
< prev
next >
Wrap
C/C++ Source or Header
|
1994-11-25
|
30KB
|
818 lines
/* musicrexx.c
Copyright (c) 1993 by Thomas E. Janzen
All Rights Reserved
THIS SOFTWARE IS FURNISHED FREE OF CHARGE FOR STUDY AND USE AND MAY
BE COPIED ONLY FOR PERSONAL USE OR COMPLETELY AS OFFERED WITH NO
CHANGES FOR FREE DISTRIBUTION. NO TITLE TO AND OWNERSHIP OF THE
SOFTWARE IS HEREBY TRANSFERRED. THOMAS E. JANZEN ASSUMES NO
RESPONSIBILITY FOR THE USE OR RELIABILITY OF THIS SOFTWARE.
Thomas E. Janzen
208A Olde Derby Road
Norwood, MA 02062-1761
(617)769-7733
** FACILITY:
**
** AlgoRhythms music improviser on Commodore (TM) Amiga (TM)
** compiled with SAS/C Amiga Compiler 6.50
**
** ABSTRACT:
**
** musicrexx.c support Arexx for AlgoRhythms.
**
** AUTHORS: Thomas E. Janzen
**
** CREATION DATE: 23-OCT-1993
**
** MODIFICATION HISTORY:
** DATE NAME DESCRIPTION
** 1 JAN 94 TEJ New for V3.0
**--
*/
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <ctype.h>
#include <devices/timer.h>
#include <math.h>
#include <clib/intuition_protos.h>
#include <proto/exec.h>
#include "arexx.h"
#include "arexxsyslib.h"
#include "musicrexx.h"
#include "scales.h"
#include "drawform.h"
#include "window.h"
#include "files.h"
#include "pitchnames.h"
#define DEFAULT_NAME "ALGORHYTHMS"
#define REPLY_STR "AlgoRhythms Acknowledge"
#define REPLY_LEN (sizeof(REPLY_STR))
#define C_NAME_LEN 80
#define C_MAX_TRIES 99
#define CMD_STR_LEN 128
#define BREAK_CHARS " \t"
#define MAX_TOKEN_QTY (10)
/*
** Tokens for the Arexx command language
*/
#define M_MENU (0XF)
#define M_ITEM (0XF0)
#define M_SUBITEM (0XF00)
#define M_SUBSUBITEM (0XF000)
#define S_PROJECT "PROJECT"
#define N_PROJECT (0X1)
#define S_PLAY "PLAY"
#define N_PLAY (0X10)
#define S_STOP "STOP"
#define N_STOP (0X20)
#define S_CONTINUE "CONTINUE"
#define N_CONTINUE (0X30)
#define S_LOADFORM "LOADFORM"
#define N_LOADFORM (0X40)
#define S_SAVEFORM "SAVEFORM"
#define N_SAVEFORM (0X50)
#define S_RECORD "RECORD"
#define N_RECORD (0X60)
#define S_ON "ON"
#define N_ON (0X100)
#define S_OFF "OFF"
#define N_OFF (0X200)
#define S_ERASE "ERASE"
#define N_ERASE (0X70)
#define S_LOAD8SVX "LOAD8SVX"
#define N_LOAD8SVX (0X80)
#define S_SAVEMIDI "SAVEMIDI"
#define N_SAVEMIDI (0X90)
#define S_QUIT "QUIT"
#define N_QUIT (0XA0)
#define S_FORM "FORM"
#define N_FORM (0X2)
#define S_MAXVOICES "MAXVOICES"
#define N_MAXVOICES (0X10)
#define S_REDRAW "REDRAW"
#define N_REDRAW (0X20)
#define S_PULSE "PULSE"
#define N_PULSE (0X30)
#define S_DURATION "DURATION"
#define N_DURATION (0X40)
#define S_PITCH "PITCH"
#define N_PITCH (0X50)
#define S_MEAN "MEAN"
#define N_MEAN (0X100)
#define S_RANGE "RANGE"
#define N_RANGE (0X200)
#define S_PERIOD "PERIOD"
#define N_PERIOD (0X1000)
#define S_PHASE "PHASE"
#define N_PHASE (0X2000)
#define S_RANDOMIZE "RANDOMIZE"
#define N_RANDOMIZE (0X300)
#define S_RHYTHM "RHYTHM"
#define N_RHYTHM (0X60)
#define S_DYNAMIC "DYNAMIC"
#define N_DYNAMIC (0X70)
#define S_TEXTURE "TEXTURE"
#define N_TEXTURE (0X80)
#define S_NOTELENGTH "NOTELENGTH"
#define N_NOTELENGTH (0X90)
#define S_MAXIMUM "MAXIMUM"
#define N_MAXIMUM (0X100)
#define S_MINIMUM "MINIMUM"
#define N_MINIMUM (0X200)
#define S_SCALE "SCALE"
#define N_SCALE (0X3)
#define S_TRANSPOSE "TRANSPOSE"
#define N_TRANSPOSE (0X0)
#define S_PENTATONIC "PENTATONIC"
#define N_PENTATONIC (0X10)
#define S_SHORTPENTATONIC "SHORTPENTATONIC"
#define N_SHORTPENTATONIC (0X20)
#define S_HARMONIC "HARMONIC"
#define N_HARMONIC (0X30)
#define S_DIATONIC "DIATONIC"
#define N_DIATONIC (0X40)
#define S_HIRAJOSHI "HIRAJOSHI"
#define N_HIRAJOSHI (0X50)
#define S_KUMOIJOSHI "KUMOIJOSHI"
#define N_KUMOIJOSHI (0X60)
#define S_KOKINJOSHI "KOKINJOSHI"
#define N_KOKINJOSHI (0X70)
#define S_WHOLETONE "WHOLETONE"
#define N_WHOLETONE (0X80)
#define S_QUINTAL "QUINTAL"
#define N_QUINTAL (0X90)
#define S_MIN3MAJ2 "MIN3MAJ2"
#define N_MIN3MAJ2 (0XA0)
#define S_HARMONICMINOR "HARMONICMINOR"
#define N_HARMONICMINOR (0XB0)
#define S_HUNGARIANMINOR "HUNGARIANMINOR"
#define N_HUNGARIANMINOR (0XC0)
#define S_DIMINISHED "DIMINISHED"
#define N_DIMINISHED (0XD0)
#define S_MODE3 "MODE3"
#define N_MODE3 (0XE0)
#define S_MODE4 "MODE4"
#define N_MODE4 (0XF0)
#define S_MODE5 "MODE5"
#define N_MODE5 (0X100)
#define S_MODE6 "MODE6"
#define N_MODE6 (0X110)
#define S_MODE7 "MODE7"
#define N_MODE7 (0X120)
#define S_QUARTAL "QUARTAL"
#define N_QUARTAL (0X130)
#define S_MAJ3MIN2 "MAJ3MIN2"
#define N_MAJ3MIN2 (0X140)
#define S_CHROMATIC "CHROMATIC"
#define N_CHROMATIC (0X150)
#define S_VOICE "VOICE"
#define N_VOICE (0X4)
#define S_CHANNEL "CHANNEL"
#define N_CHANNEL (0X10)
#define S_LOWNOTE "LOWNOTE"
#define N_LOWNOTE (0X20)
#define S_HIGHNOTE "HIGHNOTE"
#define N_HIGHNOTE (0X30)
#define S_WALKING "WALKING"
#define N_WALKING (0X40)
#define S_RANDOM "RANDOM"
#define N_RANDOM (0X50)
#define S_AUDIO "AUDIO"
#define N_AUDIO (0X60)
#define S_MIDI "MIDI"
#define N_MIDI (0X70)
typedef struct token_struct TOKEN_TYPE;
struct token_struct
{
char *token_str;
int token_num;
};
#define C_TOKEN_QTY (61)
static TOKEN_TYPE tokens[] =
{{S_PROJECT, N_PROJECT},
{S_PLAY, N_PLAY},
{S_STOP, N_STOP},
{S_CONTINUE, N_CONTINUE},
{S_LOADFORM, N_LOADFORM},
{S_SAVEFORM, N_SAVEFORM},
{S_RECORD, N_RECORD},
{S_ON, N_ON},
{S_OFF, N_OFF},
{S_ERASE, N_ERASE},
{S_LOAD8SVX, N_LOAD8SVX},
{S_SAVEMIDI, N_SAVEMIDI},
{S_QUIT, N_QUIT},
{S_FORM, N_FORM},
{S_MAXVOICES, N_MAXVOICES},
{S_REDRAW, N_REDRAW},
{S_PULSE, N_PULSE},
{S_DURATION, N_DURATION},
{S_PITCH, N_PITCH},
{S_MEAN, N_MEAN},
{S_RANGE, N_RANGE},
{S_PERIOD, N_PERIOD},
{S_PHASE, N_PHASE},
{S_RANDOMIZE, N_RANDOMIZE},
{S_RHYTHM, N_RHYTHM},
{S_DYNAMIC, N_DYNAMIC},
{S_TEXTURE, N_TEXTURE},
{S_NOTELENGTH, N_NOTELENGTH},
{S_MAXIMUM, N_MAXIMUM},
{S_MINIMUM, N_MINIMUM},
{S_SCALE, N_SCALE},
{S_TRANSPOSE, N_TRANSPOSE},
{S_PENTATONIC, N_PENTATONIC},
{S_SHORTPENTATONIC, N_SHORTPENTATONIC},
{S_HARMONIC, N_HARMONIC},
{S_DIATONIC, N_DIATONIC},
{S_HIRAJOSHI, N_HIRAJOSHI},
{S_KUMOIJOSHI, N_KUMOIJOSHI},
{S_KOKINJOSHI, N_KOKINJOSHI},
{S_WHOLETONE, N_WHOLETONE},
{S_QUINTAL, N_QUINTAL},
{S_MIN3MAJ2, N_MIN3MAJ2},
{S_HARMONICMINOR, N_HARMONICMINOR},
{S_HUNGARIANMINOR, N_HUNGARIANMINOR},
{S_DIMINISHED, N_DIMINISHED},
{S_MODE3, N_MODE3},
{S_MODE4, N_MODE4},
{S_MODE5, N_MODE5},
{S_MODE6, N_MODE6},
{S_MODE7, N_MODE7},
{S_QUARTAL, N_QUARTAL},
{S_MAJ3MIN2, N_MAJ3MIN2},
{S_CHROMATIC, N_CHROMATIC},
{S_VOICE, N_VOICE},
{S_CHANNEL, N_CHANNEL},
{S_LOWNOTE, N_LOWNOTE},
{S_HIGHNOTE, N_HIGHNOTE},
{S_WALKING, N_WALKING},
{S_RANDOM, N_RANDOM},
{S_AUDIO, N_AUDIO},
{S_MIDI, N_MIDI}};
struct MsgPort *rexx_port = NULL;
extern ULONG g_rexx_fubar = 0L;
static char port_name[C_NAME_LEN];
static struct MsgPort *register_port(LONG pri );
static struct MsgPort *register_port(LONG pri)
{
auto int name_index = 0;
auto struct MsgPort *port = NULL;
Forbid();
do
{
sprintf(port_name, "%s_%d", DEFAULT_NAME, name_index);
name_index++;
} while ((FindPort(port_name) != NULL) && (name_index < C_MAX_TRIES));
port = CreateMsgPort();
port->mp_Node.ln_Name = port_name;
port->mp_Node.ln_Pri = pri;
AddPort(port);
Permit();
return port;
}
void shut_rexx(void)
{
auto struct RexxMsg *rexx_msg;
if (rexx_port != NULL)
{
Forbid();
}
while((rexx_msg = (struct RexxMsg *)GetMsg(rexx_port)) != NULL)
{
rexx_msg->rm_Result1 = RC_FATAL;
rexx_msg->rm_Result2 = NULL;
ReplyMsg( (struct Message *) rexx_msg );
}
RemPort(rexx_port);
DeleteMsgPort(rexx_port);
Permit();
if( RexxSysBase )
{
CloseLibrary( RexxSysBase );
}
return;
}
static int parse_rexx( struct RexxMsg *msg, FORM_TYPE *form,
struct timeval *duration, int *tempo,
NOTE_EVENT_TYPE *events, NOTE_LEN_TYPE *note_len,
int *max_voices, int *scale, int *range,
int *half_range, int *delay_ticks);
ULONG rexx_mask = 0L;
void init_rexx(void)
{
RexxSysBase = OpenLibrary( (UBYTE *) "rexxsyslib.library", 0L );
if(NULL == RexxSysBase)
{
g_rexx_fubar = 1;
}
if (!g_rexx_fubar)
{
/* Create a port. */
rexx_port = register_port(1L);
if(NULL == rexx_port)
{
g_rexx_fubar = 1;
}
else
{
rexx_mask = (1L << rexx_port->mp_SigBit);
}
}
return;
}
int process_rexx(FORM_TYPE *form,
struct timeval *duration, int *tempo,
NOTE_EVENT_TYPE *events, NOTE_LEN_TYPE *note_len,
int *max_voices, int *scale, int *range,
int *half_range, int *delay_ticks)
{
auto struct RexxMsg *rexx_msg;
auto int result = 0;
while((rexx_msg = (struct RexxMsg *) GetMsg(rexx_port)) != NULL)
{
result = 1;
result = parse_rexx(rexx_msg, form, duration, tempo, events,
note_len, max_voices, scale, range,
half_range, delay_ticks);
ReplyMsg((struct Message *)rexx_msg);
}
return result;
}
static int parse_rexx(struct RexxMsg *rexx_msg, FORM_TYPE *form,
struct timeval *duration, int *tempo,
NOTE_EVENT_TYPE *events, NOTE_LEN_TYPE *note_len,
int *max_voices, int *scale, int *range,
int *half_range, int *delay_ticks)
{
auto ULONG action_code;
auto char cmd_str[CMD_STR_LEN],
*chr,
break_str[] = BREAK_CHARS;
auto int token_counter,
token_counter_inner,
token_accum,
token_qty,
compare,
temp_num,
transpose_interval,
sts,
voice_num,
result = 0; /* must be automatic */
auto TOKEN_TYPE actual_tokens[MAX_TOKEN_QTY];
action_code = rexx_msg->rm_Action & RXCODEMASK;
if(RXCOMM == action_code)
{
strcpy(cmd_str, rexx_msg->rm_Args[0]);
/*
** pre-process the command
*/
for (chr = cmd_str; *chr != '\0'; chr++)
{
*chr = toupper(*chr);
}
token_qty = 0;
actual_tokens[token_qty].token_str
= strtok(cmd_str, break_str);
if (actual_tokens[0].token_str != NULL)
{
do
{
token_qty++;
} while ((NULL !=
(actual_tokens[token_qty].token_str
= strtok((char *)NULL, break_str)))
&& (token_qty < MAX_TOKEN_QTY));
}
/*
** This is a cross product. there is a better way
** It doesn't recognique order differences.
*/
token_accum = 0;
for ( token_counter = 0; token_counter < C_TOKEN_QTY;
token_counter++)
{
for (token_counter_inner = 0; token_counter_inner <
token_qty; token_counter_inner++)
{
compare = strcmp(tokens[token_counter].token_str,
actual_tokens[token_counter_inner].token_str);
if (0 == compare)
{
token_accum |= tokens[token_counter].token_num;
}
}
}
switch (token_accum & M_MENU)
{
case N_PROJECT:
switch (token_accum & M_ITEM)
{
case N_PLAY:
result = C_REXX_PLAY;
break;
case N_STOP:
result = C_REXX_STOP;
break;
case N_CONTINUE:
result = C_REXX_CONTINUE;
break;
case N_LOADFORM:
sts
= read_file(actual_tokens[2].token_str,
duration, range,
scale, max_voices, tempo, form, events,note_len);
if (!sts)
{
if (0 == *tempo)
{
*delay_ticks = 0;
}
else
{
*delay_ticks = 50 / (*tempo);
}
*half_range = *range / 2;
draw_form(duration, form);
#if 0
SetWindowTitles(w, actual_tokens[2].token_str,
(void *) -1L);
#endif
result = C_REXX_CHANG_BOTH;
}
break;
case N_SAVEFORM:
break;
case N_RECORD:
switch (token_accum & M_SUBITEM)
{
case N_ON:
break;
case N_OFF:
break;
}
case N_ERASE:
break;
case N_LOAD8SVX:
break;
case N_SAVEMIDI:
break;
case N_QUIT:
break;
}
break;
case N_FORM:
switch (token_accum & M_ITEM)
{
case N_MAXVOICES:
*max_voices
= strtoul(actual_tokens[2].token_str,
(char **)NULL, 10L)
% 20;
result = C_REXX_CHANG_FORM;
break;
case N_REDRAW:
draw_form(duration, form);
break;
case N_PULSE:
*tempo
= strtoul(actual_tokens[2].token_str,
(char **)NULL, 10L) % 25;
if (*tempo != 0)
{
*delay_ticks = 50 / *tempo;
}
else
{
*delay_ticks = 0;
}
result = C_REXX_CHANG_FORM;
break;
case N_DURATION:
duration->tv_secs
= strtoul(actual_tokens[2].token_str,
(char **)NULL, 10L);
duration->tv_micro = 0;
result = C_REXX_CHANG_FORM;
break;
case N_PITCH:
switch (token_accum & M_SUBITEM)
{
case N_MEAN:
switch (token_accum & M_SUBSUBITEM)
{
case N_PERIOD:
form->frm_s_pitch.prm_d_mean_cycle
= strtod(actual_tokens[4]
.token_str, (char **)NULL);
result = C_REXX_CHANG_FORM;
break;
case N_PHASE:
form->frm_s_pitch.prm_d_mean_phase
= strtod(actual_tokens[4]
.token_str, (char **)NULL);
result = C_REXX_CHANG_FORM;
break;
}
break;
case N_RANGE:
switch (token_accum & M_SUBSUBITEM)
{
case N_PERIOD:
form->frm_s_pitch.prm_d_range_cycle
= strtod(actual_tokens[4]
.token_str, (char **)NULL);
result = C_REXX_CHANG_FORM;
break;
case N_PHASE:
form->frm_s_pitch.prm_d_range_phase
= strtod(actual_tokens[4]
.token_str, (char **)NULL);
result = C_REXX_CHANG_FORM;
break;
}
break;
case N_RANDOMIZE:
randomize_parameter(&form->frm_s_pitch);
result = C_REXX_CHANG_FORM;
break;
}
case N_RHYTHM:
switch (token_accum & M_SUBITEM)
{
case N_MEAN:
switch (token_accum & M_SUBSUBITEM)
{
case N_PERIOD:
form->frm_s_rhythm.prm_d_mean_cycle
= strtod(actual_tokens[4]
.token_str, (char **)NULL);
result = C_REXX_CHANG_FORM;
break;
case N_PHASE:
form->frm_s_rhythm.prm_d_mean_phase
= strtod(actual_tokens[4]
.token_str, (char **)NULL);
result = C_REXX_CHANG_FORM;
break;
}
break;
case N_RANGE:
switch (token_accum & M_SUBSUBITEM)
{
case N_PERIOD:
form->frm_s_rhythm
.prm_d_range_cycle
= strtod(actual_tokens[4]
.token_str, (char **)NULL);
result = C_REXX_CHANG_FORM;
break;
case N_PHASE:
form->frm_s_rhythm
.prm_d_range_phase
= strtod(actual_tokens[4]
.token_str, (char **)NULL);
result = C_REXX_CHANG_FORM;
break;
}
break;
case N_RANDOMIZE:
randomize_parameter(&form->frm_s_rhythm);
result = C_REXX_CHANG_FORM;
break;
}
case N_DYNAMIC:
switch (token_accum & M_SUBITEM)
{
case N_MEAN:
switch (token_accum & M_SUBSUBITEM)
{
case N_PERIOD:
form->frm_s_dynamic
.prm_d_mean_cycle
= strtod(actual_tokens[4]
.token_str, (char **)NULL);
result = C_REXX_CHANG_FORM;
break;
case N_PHASE:
form->frm_s_dynamic
.prm_d_mean_phase
= strtod(actual_tokens[4]
.token_str, (char **)NULL);
result = C_REXX_CHANG_FORM;
break;
}
break;
case N_RANGE:
switch (token_accum & M_SUBSUBITEM)
{
case N_PERIOD:
form->frm_s_dynamic
.prm_d_range_cycle
= strtod(actual_tokens[4]
.token_str, (char **)NULL);
result = C_REXX_CHANG_FORM;
break;
case N_PHASE:
form->frm_s_dynamic
.prm_d_range_phase
= strtod(actual_tokens[4]
.token_str, (char **)NULL);
result = C_REXX_CHANG_FORM;
break;
}
break;
case N_RANDOMIZE:
randomize_parameter(&form->frm_s_dynamic);
result = C_REXX_CHANG_FORM;
break;
}
case N_TEXTURE:
switch (token_accum & M_SUBITEM)
{
case N_RANGE:
switch (token_accum & M_SUBSUBITEM)
{
case N_PERIOD:
form->frm_s_texture
.prm_d_range_cycle
= strtod(actual_tokens[4]
.token_str, (char **)NULL);
result = C_REXX_CHANG_FORM;
break;
case N_PHASE:
form->frm_s_texture
.prm_d_range_phase
= strtod(actual_tokens[4]
.token_str, (char **)NULL);
result = C_REXX_CHANG_FORM;
break;
}
break;
case N_RANDOMIZE:
randomize_parameter(&form->frm_s_texture);
result = C_REXX_CHANG_FORM;
break;
}
break;
case N_NOTELENGTH:
switch (token_accum & M_SUBITEM)
{
case N_MAXIMUM:
note_len->len_i_max = (int)floor(strtod
(actual_tokens[3].token_str,
(char **)NULL) * 1000.0);
result = C_REXX_CHANG_FORM;
break;
case N_MINIMUM:
note_len->len_i_min = (int)floor(strtod
(actual_tokens[3].token_str,
(char **)NULL) * 1000.0);
result = C_REXX_CHANG_FORM;
break;
}
}
break;
case N_VOICE:
switch (token_accum & M_ITEM)
{
case N_CHANNEL:
voice_num
= strtoul(actual_tokens[1].token_str,
(char **)NULL, 10L) - 1;
if ((voice_num < MAXVOICE) && (voice_num >= 0))
{
events[voice_num].nv_i_channel =
strtoul(actual_tokens[3].token_str,
(char **)NULL, 10L);
}
result = C_REXX_CHANG_VOICE;
break;
case N_LOWNOTE:
voice_num
= strtoul(actual_tokens[1].token_str,
(char **)NULL, 10L) - 1;
if ((voice_num < MAXVOICE) && (voice_num >= 0))
{
events[voice_num].nv_i_low_pitch
= pitch_to_midi(actual_tokens[3].token_str);
}
result = C_REXX_CHANG_VOICE;
break;
case N_HIGHNOTE:
voice_num
= strtoul(actual_tokens[1].token_str,
(char **)NULL, 10L) - 1;
if ((voice_num < MAXVOICE) && (voice_num >= 0))
{
events[voice_num].nv_i_high_pitch
= pitch_to_midi(actual_tokens[3].token_str);
}
result = C_REXX_CHANG_VOICE;
break;
case N_WALKING:
voice_num
= strtoul(actual_tokens[1].token_str,
(char **)NULL, 10L) - 1;
if ((voice_num < MAXVOICE) && (voice_num >= 0))
{
events[voice_num].nv_i_walking = 1;
}
result = C_REXX_CHANG_VOICE;
break;
case N_RANDOM:
voice_num
= strtoul(actual_tokens[1].token_str,
(char **)NULL, 10L) - 1;
if ((voice_num < MAXVOICE) && (voice_num >= 0))
{
events[voice_num].nv_i_walking = 0;
}
result = C_REXX_CHANG_VOICE;
break;
case N_AUDIO:
voice_num
= strtoul(actual_tokens[1].token_str,
(char **)NULL, 10L) - 1;
if ((voice_num < MAXVOICE) && (voice_num >= 0))
{
events[voice_num].nv_i_audio = 1;
}
result = C_REXX_CHANG_VOICE;
break;
case N_MIDI:
voice_num
= strtoul(actual_tokens[1].token_str,
(char **)NULL, 10L) - 1;
if ((voice_num < MAXVOICE) && (voice_num >= 0))
{
events[voice_num].nv_i_audio = 0;
}
result = C_REXX_CHANG_VOICE;
break;
}
break;
default:
/*
** This was an illegally formatted command, so we should
** return an error code
*/
break;
}
if (N_SCALE == (token_accum & M_MENU))
{
temp_num = ((token_accum & 0XFF0) >> 4);
if (0 == temp_num)
{
transpose_interval
= strtoul(actual_tokens[1].token_str,
(char **)NULL, 10L) % 12;
transpose_scale(transpose_interval, scale, *range);
}
else
{
if ((temp_num > 0) && (temp_num < 22))
{
*range = install_scale(temp_num, scale);
*half_range = *range / 2;
}
}
/* 0 is tranpose; other is scale */
}
rexx_msg->rm_Result1 = RC_OK; /* defined in rexx/errors.h */
if( rexx_msg->rm_Action & RXFF_RESULT )
{
rexx_msg->rm_Result2
= (LONG)CreateArgstring(REPLY_STR, REPLY_LEN);
}
}
return result;
}